 /*******************************************************************************
  * Copyright (c) 2006, 2007 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/

 package org.eclipse.ui.internal.quickaccess;


 import org.eclipse.jface.resource.ImageDescriptor;

 /**
  * @since 3.3
  *
  */
 public abstract class QuickAccessElement {

     private static final int[][] EMPTY_INDICES = new int[0][0];
     private QuickAccessProvider provider;

     /**
      * @param provider
      */
     public QuickAccessElement(QuickAccessProvider provider) {
         super();
         this.provider = provider;
     }

     /**
      * Returns the label to be displayed to the user.
      *
      * @return the label
      */
     public abstract String getLabel();

     /**
      * Returns the image descriptor for this element.
      *
      * @return an image descriptor, or null if no image is available
      */
     public abstract ImageDescriptor getImageDescriptor();

     /**
      * Returns the id for this element. The id has to be unique within the
      * QuickAccessProvider that provided this element.
      *
      * @return the id
      */
     public abstract String getId();

     /**
      * Executes the associated action for this element.
      */
     public abstract void execute();

     /**
      * Return the label to be used for sorting and matching elements.
      *
      * @return the sort label
      */
     public String getSortLabel() {
         return getLabel();
     }

     /**
      * @return Returns the provider.
      */
     public QuickAccessProvider getProvider() {
         return provider;
     }

     /**
      * @param filter
      * @return
      */
     public QuickAccessEntry match(String filter,
             QuickAccessProvider providerForMatching) {
         String sortLabel = getLabel();
         int index = sortLabel.toLowerCase().indexOf(filter);
         if (index != -1) {
             return new QuickAccessEntry(this, providerForMatching,
                     new int[][] { { index, index + filter.length() - 1 } },
                     EMPTY_INDICES);
         }
         String combinedLabel = (providerForMatching.getName() + " " + getLabel()); //$NON-NLS-1$
 index = combinedLabel.toLowerCase().indexOf(filter);
         if (index != -1) {
             int lengthOfElementMatch = index + filter.length()
                     - providerForMatching.getName().length() - 1;
             if (lengthOfElementMatch > 0) {
                 return new QuickAccessEntry(this, providerForMatching,
                         new int[][] { { 0, lengthOfElementMatch - 1 } },
                         new int[][] { { index, index + filter.length() - 1 } });
             }
             return new QuickAccessEntry(this, providerForMatching,
                     EMPTY_INDICES, new int[][] { { index,
                             index + filter.length() - 1 } });
         }
         String camelCase = CamelUtil.getCamelCase(sortLabel);
         index = camelCase.indexOf(filter);
         if (index != -1) {
             int[][] indices = CamelUtil.getCamelCaseIndices(sortLabel, index, filter
                     .length());
             return new QuickAccessEntry(this, providerForMatching, indices,
                     EMPTY_INDICES);
         }
         String combinedCamelCase = CamelUtil.getCamelCase(combinedLabel);
         index = combinedCamelCase.indexOf(filter);
         if (index != -1) {
             String providerCamelCase = CamelUtil.getCamelCase(providerForMatching
                     .getName());
             int lengthOfElementMatch = index + filter.length()
                     - providerCamelCase.length();
             if (lengthOfElementMatch > 0) {
                 return new QuickAccessEntry(
                         this,
                         providerForMatching,
                         CamelUtil.getCamelCaseIndices(sortLabel, 0, lengthOfElementMatch),
                         CamelUtil.getCamelCaseIndices(providerForMatching.getName(),
                                 index, filter.length() - lengthOfElementMatch));
             }
             return new QuickAccessEntry(this, providerForMatching,
                     EMPTY_INDICES, CamelUtil.getCamelCaseIndices(providerForMatching
                             .getName(), index, filter.length()));
         }
         return null;
     }
 }

